package com.gzhryc.servlet.velocity;

import com.gzhryc.servlet.AbsVelocityTools;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 模版引擎工具类
 * @author 张浩
 * @version 1.5.3
 */
public class VelocityTools extends AbsVelocityTools{
	
	public final static String Alias = "utils";

	@Override
	public String getAlias() {
		return Alias;
	}
	
	/**
	 * 格式化日期为：yyyy-MM-dd
	 * @param date
	 * @return
	 */
	public String dateFormat(Date date){
		return dateFormat(date,"yyyy-MM-dd");
	}

	/**
	 * 格式化Date
	 * @param date
	 * @param pattern
	 * @return
	 */
	public String dateFormat(Date date,String pattern){
		if(date != null){
			SimpleDateFormat changer = new SimpleDateFormat(pattern);
			return changer.format(date);
		}
		return "";
	}

	/**
	 * 正则匹配设置值
	 * @param str
	 * @param pattern
	 * @param args
	 * @return
	 */
	public String like(String str,String pattern,String... args){
		pattern = pattern.replace("*","(.*)");
		Pattern pat = Pattern.compile("^"+pattern+"$");
		if(pat.matcher(str).find()){
			return args[0];
		}else if(args.length == 2){
			return args[1];
		}else{
			return "";
		}
	}
	
	/**
	 * 判断对象是否为空
	 * @param obj
	 * @param args
	 * @return
	 */
	public Object isNotNull(Object obj,Object... args){
		boolean flag = false;
		if(obj != null){
			if(String.class.isInstance(obj)){
				if(StringUtils.isNotBlank(obj.toString())){
					flag = true;
				}
			}else{
				flag = true;
			}
		}
		if(args != null && args.length > 0){
			if(flag){
				return args[0];
			}else if(args.length == 2){
				return args[1];
			}
		}
		return flag;
	}

	public Object isNull(Object obj,Object... args){
		boolean flag = true;
		if(obj != null){
			if(String.class.isInstance(obj)){
				if(StringUtils.isNotBlank(obj.toString())){
					flag = false;
				}
			}else{
				flag = false;
			}
		}
		if(args != null && args.length > 0){
			if(flag){
				return args[0];
			}else if(args.length == 2){
				return args[1];
			}
		}
		return flag;
	}
	
	/**
	 * 获取不为空的值，判断值是否为空
	 * @param obj
	 * @param args
	 * @return 不为空的对象或者空字符串
	 */
	public Object getNotNull(Object obj,Object... args){
		if(obj != null && StringUtils.isNotBlank(obj.toString())){
			return obj;
		}
		if(args != null){
			for(Object item : args){
				if(item != null && StringUtils.isNotBlank(item.toString())){ 
					return item;
				}
			}
		}
		return "";
	}

	/**
	 * 获取不为空的值，判断值是否为空
	 * @param obj
	 * @param args
	 * @return 不为空的对象或者空字符串
	 */
	public Object get(Object obj,Object... args){
		if(obj != null && StringUtils.isNotBlank(obj.toString())){
			return obj;
		}
		if(args != null){
			for(Object item : args){
				if(item != null && StringUtils.isNotBlank(item.toString())){
					return item;
				}
			}
		}
		return "";
	}
	
	/**
	 * 相等判断输出
	 * @param val1
	 * @param val2
	 * @param args
	 * @return
	 */
	public Object eq(Object val1,Object val2,Object... args){
		if(args == null || args.length == 0) {args = new Object[]{true,false};}
		if(val1 != null){
			if(val2 != null && val1.toString().equals(val2.toString())){
				return args[0];
			}else{
				if(args.length == 2){
					return args[1];
				}else{
					return "";
				}
			}
		}else if(val2 == null){
			return args[0];
		}
		
		if(args.length == 2){
			return args[1];
		}else{
			return "";
		}
	}
	
	public Object in(Object val1,Object[] val2,Object... args){
		if(args == null || args.length == 0) {args = new Object[]{true,false};}
		if(val1 != null){
			boolean flag = false;
			if(val2 != null && val2.length > 0){
				for(Object temp : val2) {
					if(val1.toString().equals(temp.toString())) {
						flag = true;
						break;
					}
				}
			}
			if(flag){
				return args[0];
			}else {
				if(args.length == 2){
					return args[1];
				}else{
					return "";
				}
			}
		}else if(val2 == null){
			return args[0];
		}
		
		if(args.length == 2){
			return args[1];
		}else{
			return "";
		}
	}
	
	public String URLEncode(String... urls) {
		String url = urls[0];
		try {
			for(int i=1;i<urls.length;i++) {
				if(urls[i] == null) {urls[i] = "";}
				url = url + urls[i];
			}
			return URLEncoder.encode(url, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return url;
	}
	
	/**
	 * 缩略字符串（不区分中英文字符）
	 * @param str 目标字符串
	 * @param length 截取长度
	 * @return
	 */
 	public String abbr(String str, int length) {
		if (str == null) {
			return "";
		}
		try {
			StringBuilder sb = new StringBuilder();
			int currentLength = 0;
			for (char c : replaceHtml(StringEscapeUtils.unescapeHtml4(str)).toCharArray()) {
				currentLength += String.valueOf(c).getBytes("UTF-8").length;
				if (currentLength <= length - 3) {
					sb.append(c);
				} else {
					sb.append("...");
					break;
				}
			}
			return sb.toString();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return "";
	}
	
	/**
	 * 替换掉HTML标签方法
	 */
	public String replaceHtml(String html) {
		if (StringUtils.isBlank(html)){
			return "";
		}
		String regEx = "<.+?>";
		Pattern p = Pattern.compile(regEx);
		Matcher m = p.matcher(html);
		String s = m.replaceAll("");
		return s;
	}
	
	/**
	 * 累加值
	 * @param obj
	 * @param args
	 * @return
	 */
	public Integer add(Integer obj,Integer... args){
		if(obj != null && args != null){
			for(Integer item : args){
				if(item != null){
					obj = obj + item;
				}
			}
		}
		return obj;
	}
	
	public Integer reduce(Integer obj,Integer... args){
		if(obj != null && args != null){
			for(Integer item : args){
				if(item != null){
					obj = obj - item;
				}
			}
		}
		return obj;
	}
	
	/**
	 * 添加资源路径的域名
	 * @param url
	 * @param domain
	 * @return
	 */
	public String domainUrl(String url,String domain){
		if(StringUtils.isNotBlank(url) && !url.startsWith("http")){
			if(StringUtils.isNotBlank(domain)){
				return domain + url;
			}
		}
		return url;
	}

}
